package com.ruoyi.customer.service.impl;

import com.ruoyi.common.constant.DictConstants;
import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.MyUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.customer.domain.CustomerCoupon;
import com.ruoyi.customer.mapper.CustomerCouponMapper;
import com.ruoyi.customer.service.ICustomerCouponService;
import com.ruoyi.market.domain.Coupon;
import com.ruoyi.market.mapper.CouponMapper;
import com.ruoyi.market.service.ICouponService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.validation.Validator;
import java.util.List;
import java.util.Date;

/**
 * 客户客户卡券业务层处理
 * 
 * @author ruoyi
 */
@Service
public class CustomerCouponServiceImpl implements ICustomerCouponService
{

    @Autowired
    private CustomerCouponMapper customerCouponMapper;

    @Autowired
    private ICouponService couponService;

    @Autowired
    protected Validator validator;

    /**
     * 根据条件分页查询客户卡券列表
     * 
     * @param customerCoupon 客户卡券信息
     * @return 客户卡券信息集合信息
     */
    @Override
    public List<CustomerCoupon> selectCustomerCouponList(CustomerCoupon customerCoupon)
    {
        return customerCouponMapper.selectCustomerCouponList(customerCoupon);
    }

    /**
     * 通过客户卡券ID查询客户卡券
     * 
     * @param id 客户卡券ID
     * @return 客户卡券对象信息
     */
    @Override
    public CustomerCoupon selectCustomerCouponById(Long id)
    {
        return customerCouponMapper.selectCustomerCouponById(id);
    }

    /**
     * 校验客户卡券是否唯一
     *
     * @param customerCoupon 客户卡券信息
     * @return 结果
     */
    @Override
    public boolean checkCustomerCouponUnique(CustomerCoupon customerCoupon)
    {
        Long id = StringUtils.isNull(customerCoupon.getId()) ? -1L : customerCoupon.getId();
        CustomerCoupon info = customerCouponMapper.checkCustomerCouponUnique(customerCoupon);
        if (StringUtils.isNotNull(info) && info.getId().longValue() != id.longValue())
        {
            return DictConstants.NOT_UNIQUE;
        }
        return DictConstants.UNIQUE;
    }

    /**
     * 校验客户卡券是否唯一
     *
     * @param customerCoupon 客户卡券信息
     * @return 结果
     */
    @Override
    public boolean checkCustomerCouponCanInsert(CustomerCoupon customerCoupon)
    {
        return true;
    }

    /**
     * 新增保存客户卡券信息
     * 
     * @param customerCoupon 客户卡券信息
     * @return 结果
     */
    @Override
    @Transactional
    public int insertCustomerCoupon(CustomerCoupon customerCoupon)
    {
        Long userId = SecurityUtils.getUserId();
        customerCoupon.setCustomerId(userId);
        Coupon coupon = couponService.selectCouponById(customerCoupon.getCouponId());
        int count = customerCouponMapper.selectCustomerCouponCount(customerCoupon);
        if (StringUtils.isNull(coupon))
        {
            throw new ServiceException("领取失败：卡券不存在");
        }
        if (!StringUtils.equals(UserConstants.ZERO, coupon.getStatus()))
        {
            throw new ServiceException("领取失败：卡券状态非可领取状态");
        }
        if (coupon.getCouponReceiveLimit() <= count)
        {
            throw new ServiceException("领取失败：领取次数已达上限");
        }

        String today = MyUtils.formatDate(new Date(), "yyyy-MM-dd HH:mm:ss"); // 今日此刻
        String addDays = MyUtils.addDay(today, coupon.getCouponValidityDay());
        customerCoupon.setExpireTime(MyUtils.formatStringToDate(addDays, "yyyy-MM-dd HH:mm:ss"));
        coupon.setCouponReceiveCount(coupon.getCouponUseCount() + 1);
        couponService.updateCoupon(coupon);
        // 新增客户卡券信息
        int rows = customerCouponMapper.insertCustomerCoupon(customerCoupon);
        return rows;
    }

    /**
     * 修改保存客户卡券信息
     * 
     * @param customerCoupon 客户卡券信息
     * @return 结果
     */
    @Override
    @Transactional
    public int updateCustomerCoupon(CustomerCoupon customerCoupon)
    {
        return customerCouponMapper.updateCustomerCoupon(customerCoupon);
    }

    /**
     * 查询统计客户卡券信息
     *
     * @param customerCoupon 客户卡券信息
     * @return 结果
     */
    @Override
    @Transactional
    public int selectCustomerCouponCount(CustomerCoupon customerCoupon)
    {
        return customerCouponMapper.selectCustomerCouponCount(customerCoupon);
    }

    /**
     * 修改客户卡券使用状态
     * 
     * @param customerCoupon 客户卡券信息
     * @return 结果
     */
    @Override
    public int updateCustomerCouponStatus(CustomerCoupon customerCoupon)
    {
        return customerCouponMapper.updateCustomerCoupon(customerCoupon);
    }


    /**
     * 修改客户卡券激活状态
     *
     * @param customerCoupon 客户卡券信息
     * @return 结果
     */
    @Override
    public int updateCustomerCouponActive(CustomerCoupon customerCoupon)
    {
        return customerCouponMapper.updateCustomerCoupon(customerCoupon);
    }

    /**
     * 批量删除客户卡券信息
     * 
     * @param ids 需要删除的客户卡券ID
     * @return 结果
     */
    @Override
    @Transactional
    public int deleteCustomerCouponByIds(Long[] ids) { return customerCouponMapper.deleteCustomerCouponByIds(ids); }

}
